*/
-#include <QtCore/QRegExp>
-#include <QtCore/QTextStream>
-#include <QtCore/QDebug>
+#include <QtCore/QChar> // for QChar
+#include <QtCore/QDateTime> // for QDateTime, QDate
+#include <QtCore/QString> // for QString, QCharRef
+#include <QtCore/QTextStream> // for QTextStream
+#include <QtCore/QtGlobal> // for foreach
#include "csv_util.h"
#include "defs.h"
xcsv_file.field_encloser = QString();
xcsv_file.record_delimiter = QString();
xcsv_file.badchars = QString();
- xcsv_file.ifield_ct = 0;
- xcsv_file.ofield_ct = 0;
xcsv_file.file = nullptr;
xcsv_file.stream = nullptr;
xcsv_file.codec = nullptr;
xcsv_file.prologue.clear();
xcsv_file.epilogue.clear();
- QUEUE_INIT(&xcsv_file.ifield);
- /* ofield is alloced to allow pointing back at ifields
- * where applicable.
- */
- xcsv_file.ofield = (queue*) xcalloc(sizeof(queue), 1);
- QUEUE_INIT(xcsv_file.ofield);
+ xcsv_file.ifields.clear();
+ xcsv_file.ofields.clear();
/*
* Provide a sane default for CSV _files_.
*/
XcsvFile::XcsvFile() {
is_internal = false;
- ifield_ct = ofield_ct = 0;
extension = nullptr;
// xcsv_file_init();
}
-static void validate_fieldmap(const field_map_t* fmp, bool is_output) {
- QString qkey = fmp->key;
- QString qval = fmp->val;
- QString qprintfc = fmp->printfc;
-
- if (qkey.isEmpty()) {
+static void validate_fieldmap(const field_map& fmp, bool is_output) {
+ if (fmp.key.isEmpty()) {
Fatal() << MYNAME << ": xcsv style is missing" <<
(is_output ? "output" : "input") << "field type.";
}
- if (!fmp->val) {
- Fatal() << MYNAME << ": xcsv style" << qkey << "is missing default.";
+ if (fmp.val.isNull()) {
+ Fatal() << MYNAME << ": xcsv style" << fmp.key.constData() << "is missing default.";
}
- if (is_output && !fmp->printfc) {
- Fatal() << MYNAME << ": xcsv style" << qkey << "output is missing format specifier.";
+ if (is_output && fmp.printfc.isNull()) {
+ Fatal() << MYNAME << ": xcsv style" << fmp.key.constData() << "output is missing format specifier.";
}
}
/* usage: xcsv_ifield_add("DESCRIPTION", "", "%s") */
/*****************************************************************************/
void
-xcsv_ifield_add(const char* key, const char* val, const char* pfc)
+xcsv_ifield_add(const QString& qkey, const QString& qval, const QString& qpfc)
{
- field_map_t* fmp = (field_map_t*) xcalloc(sizeof(*fmp), 1);
- struct xt_mapping* xm = Perfect_Hash::in_word_set(key, strlen(key));
+ QByteArray key = qkey.toUtf8();
+ QByteArray val = qval.toUtf8();
+ QByteArray pfc = qpfc.toUtf8();
- fmp->key = key;
- fmp->hashed_key = xm ? xm->xt_token : -1;
- fmp->val = val;
- fmp->printfc = pfc;
+ struct xt_mapping* xm = Perfect_Hash::in_word_set(key.constData(), strlen(key.constData()));
+
+ field_map fmp(key, val, pfc, xm ? xm->xt_token : -1);
validate_fieldmap(fmp, false);
- ENQUEUE_TAIL(&xcsv_file.ifield, &fmp->Q);
- xcsv_file.ifield_ct++;
+ xcsv_file.ifields.append(fmp);
}
/*****************************************************************************/
/* usage: xcsv_ofield_add("LAT_DECIMAL", "", "%08.5lf") */
/*****************************************************************************/
void
-xcsv_ofield_add(const char* key, const char* val, const char* pfc, int options)
+xcsv_ofield_add(const QString& qkey, const QString& qval, const QString& qpfc, unsigned options)
{
- field_map_t* fmp = (field_map_t*) xcalloc(sizeof(*fmp), 1);
- struct xt_mapping* xm = Perfect_Hash::in_word_set(key, strlen(key));
-
- fmp->key = key;
- fmp->hashed_key = xm ? xm->xt_token : -1;
- fmp->val = val;
- fmp->printfc = pfc;
- fmp->options = options;
+ QByteArray key = qkey.toUtf8();
+ QByteArray val = qval.toUtf8();
+ QByteArray pfc = qpfc.toUtf8();
+
+ struct xt_mapping* xm = Perfect_Hash::in_word_set(key.constData(), strlen(key.constData()));
+
+ field_map fmp(key, val, pfc, xm ? xm->xt_token : -1, options);
validate_fieldmap(fmp, true);
- ENQUEUE_TAIL(xcsv_file.ofield, &fmp->Q);
- xcsv_file.ofield_ct++;
+ xcsv_file.ofields.append(fmp);
}
/*****************************************************************************/
/* usage: xcsv_prologue_add("Four score and seven years ago today,") */
/*****************************************************************************/
void
-xcsv_prologue_add(QString prologue)
+xcsv_prologue_add(const QString& prologue)
{
xcsv_file.prologue.append(prologue);
}
/* usage: xcsv_epilogue_add("shall not perish from the earth.") */
/*****************************************************************************/
void
-xcsv_epilogue_add(QString epilogue)
+xcsv_epilogue_add(const QString& epilogue)
{
xcsv_file.epilogue.append(epilogue);
}
/* usage: xcsv_parse_val("-123.34", *waypt, *field_map) */
/*****************************************************************************/
static void
-xcsv_parse_val(const char* s, Waypoint* wpt, const field_map_t* fmp,
+xcsv_parse_val(const char* s, Waypoint* wpt, const field_map& fmp,
route_head** trk)
{
const char* enclosure = "";
geocache_data* gc_data = nullptr;
- if (!fmp->printfc) {
- fatal(MYNAME ": xcsv style '%s' is missing format specifier", fmp->key);
+ if (fmp.printfc.isNull()) {
+ fatal(MYNAME ": xcsv style '%s' is missing format specifier", fmp.key.constData());
}
- if (0 == strcmp(fmp->printfc, "\"%s\"")) {
+ if (0 == strcmp(fmp.printfc.constData(), "\"%s\"")) {
enclosure = "\"";
}
- switch (fmp->hashed_key) {
+ switch (fmp.hashed_key) {
case XT_IGNORE:
/* IGNORE -- Categorically ignore this... */
break;
wpt->SetCreationTime(yyyymmdd_to_time(s));
break;
case XT_GMT_TIME:
- wpt->SetCreationTime(sscanftime(s, fmp->printfc, 1));
+ wpt->SetCreationTime(sscanftime(s, fmp.printfc.constData(), 1));
break;
case XT_LOCAL_TIME:
if (ugetenv("GPSBABEL_FREEZE_TIME").isNull()) {
- wpt->creation_time += sscanftime(s, fmp->printfc, 0);
+ wpt->creation_time += sscanftime(s, fmp.printfc.constData(), 0);
} else {
/* Force constant time zone for test */
- wpt->creation_time += sscanftime(s, fmp->printfc, 1);
+ wpt->creation_time += sscanftime(s, fmp.printfc.constData(), 1);
}
break;
/* Useful when time and date are in separate fields
GMT / Local offset is handled by the two cases above */
case XT_HMSG_TIME:
case XT_HMSL_TIME:
- wpt->creation_time += addhms(s, fmp->printfc);
+ wpt->creation_time += addhms(s, fmp.printfc.constData());
break;
case XT_ISO_TIME:
case XT_ISO_TIME_MS:
}
break;
case -1:
- if (strncmp(fmp->key, "LON_10E", 7) == 0) {
- wpt->longitude = atof(s) / pow(10.0, atof(fmp->key+7));
- } else if (strncmp(fmp->key, "LAT_10E", 7) == 0) {
- wpt->latitude = atof(s) / pow(10.0, atof(fmp->key+7));
+ if (strncmp(fmp.key.constData(), "LON_10E", 7) == 0) {
+ wpt->longitude = atof(s) / pow(10.0, atof(fmp.key.constData()+7));
+ } else if (strncmp(fmp.key.constData(), "LAT_10E", 7) == 0) {
+ wpt->latitude = atof(s) / pow(10.0, atof(fmp.key.constData()+7));
} else {
- warning(MYNAME ": Unknown style directive: %s\n", fmp->key);
+ warning(MYNAME ": Unknown style directive: %s\n", fmp.key.constData());
}
break;
s = csv_lineparse(s, CSTR(xcsv_file.field_delimiter),
CSTR(xcsv_file.field_encloser), linecount);
- if (QUEUE_EMPTY(&xcsv_file.ifield)) {
+ if (xcsv_file.ifields.isEmpty()) {
fatal(MYNAME ": attempt to read, but style '%s' has no IFIELDs in it.\n", CSTR(xcsv_file.description)? CSTR(xcsv_file.description) : "unknown");
}
- /* reset the ifield queue */
- queue* elem = QUEUE_FIRST(&xcsv_file.ifield);
+ int ifield_idx = 0;
/* now rip the line apart, advancing the queue for each tear
* off the beginning of buff since there's no index into queue.
*/
while (s) {
- field_map_t* fmp = reinterpret_cast<field_map_t *>(elem);
+ const field_map& fmp = xcsv_file.ifields.at(ifield_idx++);
xcsv_parse_val(s, wpt_tmp, fmp, &trk);
- elem = QUEUE_NEXT(elem);
-
- if (elem == &xcsv_file.ifield) {
+ if (ifield_idx >= xcsv_file.ifields.size()) {
/* we've wrapped the queue. so stop parsing! */
while (s) {
s = csv_lineparse(nullptr, "\xff","",linecount);
xcsv_waypt_pr(const Waypoint* wpt)
{
QString buff;
- queue* elem, *tmp;
double latitude, longitude;
int32 utmz;
double utme, utmn;
}
int i = 0;
- QUEUE_FOR_EACH(xcsv_file.ofield, elem, tmp) {
+ for (const auto& fmp : xcsv_file.ofields) {
double lat = latitude;
double lon = longitude;
/*
*/
int field_is_unknown = 0;
- field_map_t* fmp = reinterpret_cast<field_map_t *>(elem);
-
- if ((i != 0) && !(fmp->options & OPTIONS_NODELIM)) {
+ if ((i != 0) && !(fmp.options & OPTIONS_NODELIM)) {
*xcsv_file.stream << write_delimiter;
}
- if (fmp->options & OPTIONS_ABSOLUTE) {
+ if (fmp.options & OPTIONS_ABSOLUTE) {
lat = fabs(lat);
lon = fabs(lon);
}
i++;
- switch (fmp->hashed_key) {
+ switch (fmp.hashed_key) {
case XT_IGNORE:
/* IGNORE -- Write the char printf conversion */
- buff = QString().sprintf(fmp->printfc, "");
+ buff = QString().sprintf(fmp.printfc.constData(), "");
break;
case XT_INDEX:
- buff = QString().sprintf(fmp->printfc, waypt_out_count + atoi(fmp->val));
+ buff = QString().sprintf(fmp.printfc.constData(), waypt_out_count + atoi(fmp.val.constData()));
break;
case XT_CONSTANT: {
- auto cp = xcsv_get_char_from_constant_table(fmp->val);
+ auto cp = xcsv_get_char_from_constant_table(fmp.val.constData());
if (!cp.isEmpty()) {
- buff = QString().sprintf(fmp->printfc, CSTR(cp));
+ buff = QString().sprintf(fmp.printfc.constData(), CSTR(cp));
} else {
- buff = QString().sprintf(fmp->printfc, fmp->val);
+ buff = QString().sprintf(fmp.printfc.constData(), fmp.val.constData());
}
}
break;
case XT_SHORTNAME:
- buff = QString().sprintf(fmp->printfc,
- shortname.isEmpty() ? fmp->val : CSTR(shortname));
+ buff = QString().sprintf(fmp.printfc.constData(),
+ shortname.isEmpty() ? fmp.val.constData() : CSTR(shortname));
break;
case XT_ANYNAME:
anyname = wpt->notes;
}
if (anyname.isEmpty()) {
- anyname = fmp->val;
+ anyname = fmp.val.constData();
}
- buff = QString().sprintf(fmp->printfc, CSTR(anyname));
+ buff = QString().sprintf(fmp.printfc.constData(), CSTR(anyname));
}
break;
case XT_DESCRIPTION:
- buff = QString().sprintf(fmp->printfc,
- description.isEmpty() ? fmp->val : CSTR(description));
+ buff = QString().sprintf(fmp.printfc.constData(),
+ description.isEmpty() ? fmp.val.constData() : CSTR(description));
break;
case XT_NOTES:
- buff = QString().sprintf(fmp->printfc,
- wpt->notes.isEmpty() ? fmp->val : CSTR(wpt->notes));
+ buff = QString().sprintf(fmp.printfc.constData(),
+ wpt->notes.isEmpty() ? fmp.val.constData() : CSTR(wpt->notes));
break;
case XT_URL: {
if (xcsv_urlbase) {
}
if (wpt->HasUrlLink()) {
UrlLink l = wpt->GetUrlLink();
- buff += QString().sprintf(fmp->printfc, CSTR(l.url_));
+ buff += QString().sprintf(fmp.printfc.constData(), CSTR(l.url_));
} else {
- buff += QString().sprintf(fmp->printfc, fmp->val && *fmp->val ? fmp->val : "\"\"");
+ buff += QString().sprintf(fmp.printfc.constData(), fmp.val.constData() && *fmp.val.constData() ? fmp.val.constData() : "\"\"");
}
}
break;
case XT_URL_LINK_TEXT:
if (wpt->HasUrlLink()) {
UrlLink l = wpt->GetUrlLink();
- buff = QString().sprintf(fmp->printfc,
- !l.url_link_text_.isEmpty() ? CSTR(l.url_link_text_) : fmp->val);
+ buff = QString().sprintf(fmp.printfc.constData(),
+ !l.url_link_text_.isEmpty() ? CSTR(l.url_link_text_) : fmp.val.constData());
}
break;
case XT_ICON_DESCR:
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
(!wpt->icon_descr.isNull()) ?
- CSTR(wpt->icon_descr) : fmp->val);
+ CSTR(wpt->icon_descr) : fmp.val.constData());
break;
/* LATITUDE CONVERSION***********************************************/
case XT_LAT_DECIMAL:
/* latitude as a pure decimal value */
- buff = QString().sprintf(fmp->printfc, lat);
+ buff = QString().sprintf(fmp.printfc.constData(), lat);
break;
case XT_LAT_DECIMALDIR:
/* latitude as a decimal value with N/S after it */
- buff = QString().sprintf(fmp->printfc, fabs(lat),
+ buff = QString().sprintf(fmp.printfc.constData(), fabs(lat),
LAT_DIR(lat));
break;
case XT_LAT_DIRDECIMAL:
/* latitude as a decimal value with N/S before it */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
LAT_DIR(lat),
fabs(lat));
break;
case XT_LAT_INT32DEG:
/* latitude as an integer offset from 0 degrees */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
dec_to_intdeg(lat));
break;
case XT_LAT_DDMMDIR:
/*latitude as (degrees * 100) + decimal minutes, with N/S after it */
- buff = dec_to_human(fmp->printfc, "SN", degrees2ddmm(lat));
+ buff = dec_to_human(fmp.printfc.constData(), "SN", degrees2ddmm(lat));
break;
case XT_LAT_HUMAN_READABLE:
- buff = dec_to_human(fmp->printfc, "SN", lat);
+ buff = dec_to_human(fmp.printfc.constData(), "SN", lat);
break;
case XT_LAT_NMEA:
- buff = QString().sprintf(fmp->printfc, degrees2ddmm(lat));
+ buff = QString().sprintf(fmp.printfc.constData(), degrees2ddmm(lat));
break;
// case XT_LAT_10E is handled outside the switch.
/* LONGITUDE CONVERSIONS*********************************************/
case XT_LON_DECIMAL:
/* longitude as a pure decimal value */
- buff = QString().sprintf(fmp->printfc, lon);
+ buff = QString().sprintf(fmp.printfc.constData(), lon);
break;
case XT_LON_DECIMALDIR:
/* latitude as a decimal value with N/S after it */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
fabs(lon),
LON_DIR(lon));
break;
case XT_LON_DIRDECIMAL:
/* latitude as a decimal value with N/S before it */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
LON_DIR(lon),
fabs(lon));
break;
case XT_LON_INT32DEG:
/* longitudee as an integer offset from 0 degrees */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
dec_to_intdeg(lon));
break;
case XT_LON_DDMMDIR:
/* longidute as (degrees * 100) + decimal minutes, with W/E after it*/
- buff = dec_to_human(fmp->printfc, "WE", degrees2ddmm(lon));
+ buff = dec_to_human(fmp.printfc.constData(), "WE", degrees2ddmm(lon));
break;
case XT_LON_HUMAN_READABLE:
- buff = dec_to_human(fmp->printfc, "WE", lon);
+ buff = dec_to_human(fmp.printfc.constData(), "WE", lon);
break;
case XT_LATLON_HUMAN_READABLE:
- buff = dec_to_human(fmp->printfc, "SN", lat);
+ buff = dec_to_human(fmp.printfc.constData(), "SN", lat);
buff += " ";
- buff += dec_to_human(fmp->printfc, "WE", lon);
+ buff += dec_to_human(fmp.printfc.constData(), "WE", lon);
// Tidy up leading, trailing, middle whitespace.
buff = buff.simplified();
break;
case XT_LON_NMEA:
- buff = QString().sprintf(fmp->printfc, degrees2ddmm(lon));
+ buff = QString().sprintf(fmp.printfc.constData(), degrees2ddmm(lon));
break;
// case XT_LON_10E is handled outside the switch.
/* DIRECTIONS *******************************************************/
case XT_LAT_DIR:
/* latitude N/S as a char */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
LAT_DIR(lat));
break;
case XT_LON_DIR:
/* longitude E/W as a char */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
LON_DIR(lon));
break;
if (! GPS_Math_WGS84_To_UKOSMap_M(wpt->latitude, wpt->longitude, &east, &north, map))
fatal(MYNAME ": Position (%.5f/%.5f) outside of BNG.\n",
wpt->latitude, wpt->longitude);
- buff = QString().sprintf(fmp->printfc, map, (int)(east + 0.5), (int)(north + 0.5));
+ buff = QString().sprintf(fmp.printfc.constData(), map, (int)(east + 0.5), (int)(north + 0.5));
}
break;
case XT_UTM: {
&utme, &utmn, &utmz, &utmzc);
snprintf(tbuf, sizeof(tbuf), "%d%c %6.0f %7.0f",
utmz, utmzc, utme, utmn);
- buff = QString().sprintf(fmp->printfc, tbuf);
+ buff = QString().sprintf(fmp.printfc.constData(), tbuf);
}
break;
case XT_UTM_ZONE:
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
- buff = QString().sprintf(fmp->printfc, utmz);
+ buff = QString().sprintf(fmp.printfc.constData(), utmz);
break;
case XT_UTM_ZONEC:
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
- buff = QString().sprintf(fmp->printfc, utmzc);
+ buff = QString().sprintf(fmp.printfc.constData(), utmzc);
break;
case XT_UTM_ZONEF: {
char tbuf[10];
&utme, &utmn, &utmz, &utmzc);
tbuf[0] = 0;
snprintf(tbuf, sizeof(tbuf), "%d%c", utmz, utmzc);
- buff = QString().sprintf(fmp->printfc, tbuf);
+ buff = QString().sprintf(fmp.printfc.constData(), tbuf);
}
break;
case XT_UTM_NORTHING:
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
- buff = QString().sprintf(fmp->printfc, utmn);
+ buff = QString().sprintf(fmp.printfc.constData(), utmn);
break;
case XT_UTM_EASTING:
GPS_Math_WGS84_To_UTM_EN(wpt->latitude, wpt->longitude,
&utme, &utmn, &utmz, &utmzc);
- buff = QString().sprintf(fmp->printfc, utme);
+ buff = QString().sprintf(fmp.printfc.constData(), utme);
break;
/* ALTITUDE CONVERSIONS**********************************************/
case XT_ALT_FEET:
/* altitude in feet as a decimal value */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
METERS_TO_FEET(wpt->altitude));
break;
case XT_ALT_METERS:
/* altitude in meters as a decimal value */
- buff = QString().sprintf(fmp->printfc,
+ buff = QString().sprintf(fmp.printfc.constData(),
wpt->altitude);
break;
case XT_PATH_DISTANCE_MILES:
/* path (route/track) distance in miles */
if (wpt->odometer_distance) {
- buff = QString().sprintf(fmp->printfc, METERS_TO_MILES(wpt->odometer_distance));
+ buff = QString().sprintf(fmp.printfc.constData(), METERS_TO_MILES(wpt->odometer_distance));
} else {
- buff = QString().sprintf(fmp->printfc, pathdist);
+ buff = QString().sprintf(fmp.printfc.constData(), pathdist);
}
break;
case XT_PATH_DISTANCE_METERS:
/* path (route/track) distance in meters */
if (wpt->odometer_distance) {
- buff = QString().sprintf(fmp->printfc, wpt->odometer_distance);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->odometer_distance);
} else {
- buff = QString().sprintf(fmp->printfc, MILES_TO_METERS(pathdist));
+ buff = QString().sprintf(fmp.printfc.constData(), MILES_TO_METERS(pathdist));
}
break;
case XT_PATH_DISTANCE_KM:
/* path (route/track) distance in kilometers */
if (wpt->odometer_distance) {
- buff = QString().sprintf(fmp->printfc, wpt->odometer_distance / 1000.0);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->odometer_distance / 1000.0);
} else {
- buff = QString().sprintf(fmp->printfc, MILES_TO_METERS(pathdist) / 1000.0);
+ buff = QString().sprintf(fmp.printfc.constData(), MILES_TO_METERS(pathdist) / 1000.0);
}
break;
case XT_PATH_SPEED:
- buff = QString().sprintf(fmp->printfc, wpt->speed);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->speed);
break;
case XT_PATH_SPEED_KPH:
- buff = QString().sprintf(fmp->printfc, MPS_TO_KPH(wpt->speed));
+ buff = QString().sprintf(fmp.printfc.constData(), MPS_TO_KPH(wpt->speed));
break;
case XT_PATH_SPEED_MPH:
- buff = QString().sprintf(fmp->printfc, MPS_TO_MPH(wpt->speed));
+ buff = QString().sprintf(fmp.printfc.constData(), MPS_TO_MPH(wpt->speed));
break;
case XT_PATH_SPEED_KNOTS:
- buff = QString().sprintf(fmp->printfc, MPS_TO_KNOTS(wpt->speed));
+ buff = QString().sprintf(fmp.printfc.constData(), MPS_TO_KNOTS(wpt->speed));
break;
case XT_PATH_COURSE:
- buff = QString().sprintf(fmp->printfc, wpt->course);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->course);
break;
/* HEART RATE CONVERSION***********************************************/
case XT_HEART_RATE:
- buff = QString().sprintf(fmp->printfc, wpt->heartrate);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->heartrate);
break;
/* CADENCE CONVERSION***********************************************/
case XT_CADENCE:
- buff = QString().sprintf(fmp->printfc, wpt->cadence);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->cadence);
break;
/* POWER CONVERSION***********************************************/
case XT_POWER:
- buff = QString().sprintf(fmp->printfc, wpt->power);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->power);
break;
case XT_TEMPERATURE:
- buff = QString().sprintf(fmp->printfc, wpt->temperature);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->temperature);
break;
case XT_TEMPERATURE_F:
- buff = QString().sprintf(fmp->printfc, CELSIUS_TO_FAHRENHEIT(wpt->temperature));
+ buff = QString().sprintf(fmp.printfc.constData(), CELSIUS_TO_FAHRENHEIT(wpt->temperature));
break;
/* TIME CONVERSIONS**************************************************/
case XT_EXCEL_TIME:
/* creation time as an excel (double) time */
- buff = QString().sprintf(fmp->printfc, TIMET_TO_EXCEL(wpt->GetCreationTime().toTime_t()));
+ buff = QString().sprintf(fmp.printfc.constData(), TIMET_TO_EXCEL(wpt->GetCreationTime().toTime_t()));
break;
case XT_TIMET_TIME:
/* time as a time_t variable */
{
time_t tt = wpt->GetCreationTime().toTime_t();
- buff = QString().sprintf(fmp->printfc, tt);
+ buff = QString().sprintf(fmp.printfc.constData(), tt);
}
break;
}
break;
case XT_YYYYMMDD_TIME:
- buff = QString().sprintf(fmp->printfc, time_to_yyyymmdd(wpt->GetCreationTime()));
+ buff = QString().sprintf(fmp.printfc.constData(), time_to_yyyymmdd(wpt->GetCreationTime()));
break;
case XT_GMT_TIME:
- buff = writetime(fmp->printfc, wpt->GetCreationTime(), true);
+ buff = writetime(fmp.printfc.constData(), wpt->GetCreationTime(), true);
break;
case XT_LOCAL_TIME:
- buff = writetime(fmp->printfc, wpt->GetCreationTime(), false);
+ buff = writetime(fmp.printfc.constData(), wpt->GetCreationTime(), false);
break;
case XT_HMSG_TIME:
- buff = writehms(fmp->printfc, wpt->GetCreationTime(), 1);
+ buff = writehms(fmp.printfc.constData(), wpt->GetCreationTime(), 1);
break;
case XT_HMSL_TIME:
- buff = writehms(fmp->printfc, wpt->GetCreationTime(), 0);
+ buff = writehms(fmp.printfc.constData(), wpt->GetCreationTime(), 0);
break;
case XT_ISO_TIME:
buff = writetime("%Y-%m-%dT%H:%M:%SZ", wpt->GetCreationTime(), true);
buff = wpt->GetCreationTime().toPrettyString();
break;
case XT_GEOCACHE_LAST_FOUND:
- buff = QString().sprintf(fmp->printfc, time_to_yyyymmdd(wpt->gc_data->last_found));
+ buff = QString().sprintf(fmp.printfc.constData(), time_to_yyyymmdd(wpt->gc_data->last_found));
break;
/* GEOCACHE STUFF **************************************************/
case XT_GEOCACHE_DIFF:
/* Geocache Difficulty as a double */
- buff = QString().sprintf(fmp->printfc, wpt->gc_data->diff / 10.0);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->gc_data->diff / 10.0);
field_is_unknown = !wpt->gc_data->diff;
break;
case XT_GEOCACHE_TERR:
/* Geocache Terrain as a double */
- buff = QString().sprintf(fmp->printfc, wpt->gc_data->terr / 10.0);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->gc_data->terr / 10.0);
field_is_unknown = !wpt->gc_data->terr;
break;
case XT_GEOCACHE_CONTAINER:
/* Geocache Container */
- buff = QString().sprintf(fmp->printfc, gs_get_container(wpt->gc_data->container));
+ buff = QString().sprintf(fmp.printfc.constData(), gs_get_container(wpt->gc_data->container));
field_is_unknown = wpt->gc_data->container == gc_unknown;
break;
case XT_GEOCACHE_TYPE:
/* Geocache Type */
- buff = QString().sprintf(fmp->printfc, gs_get_cachetype(wpt->gc_data->type));
+ buff = QString().sprintf(fmp.printfc.constData(), gs_get_cachetype(wpt->gc_data->type));
field_is_unknown = wpt->gc_data->type == gt_unknown;
break;
case XT_GEOCACHE_HINT:
- buff = QString().sprintf(fmp->printfc, CSTR(wpt->gc_data->hint));
+ buff = QString().sprintf(fmp.printfc.constData(), CSTR(wpt->gc_data->hint));
field_is_unknown = !wpt->gc_data->hint.isEmpty();
break;
case XT_GEOCACHE_PLACER:
- buff = QString().sprintf(fmp->printfc, CSTR(wpt->gc_data->placer));
+ buff = QString().sprintf(fmp.printfc.constData(), CSTR(wpt->gc_data->placer));
field_is_unknown = !wpt->gc_data->placer.isEmpty();
break;
case XT_GEOCACHE_ISAVAILABLE:
if (wpt->gc_data->is_available == status_false) {
- buff = QString().sprintf(fmp->printfc, "False");
+ buff = QString().sprintf(fmp.printfc.constData(), "False");
} else if (wpt->gc_data->is_available == status_true) {
- buff = QString().sprintf(fmp->printfc, "True");
+ buff = QString().sprintf(fmp.printfc.constData(), "True");
} else {
- buff = QString().sprintf(fmp->printfc, "Unknown");
+ buff = QString().sprintf(fmp.printfc.constData(), "Unknown");
}
break;
case XT_GEOCACHE_ISARCHIVED:
if (wpt->gc_data->is_archived == status_false) {
- buff = QString().sprintf(fmp->printfc, "False");
+ buff = QString().sprintf(fmp.printfc.constData(), "False");
} else if (wpt->gc_data->is_archived == status_true) {
- buff = QString().sprintf(fmp->printfc, "True");
+ buff = QString().sprintf(fmp.printfc.constData(), "True");
} else {
- buff = QString().sprintf(fmp->printfc, "Unknown");
+ buff = QString().sprintf(fmp.printfc.constData(), "Unknown");
}
break;
/* Tracks and Routes ***********************************************/
case XT_TRACK_NEW:
if (csv_track) {
if (WAYPT_HAS(wpt,new_trkseg)) {
- buff = QString().sprintf(fmp->printfc, 1);
+ buff = QString().sprintf(fmp.printfc.constData(), 1);
} else {
- buff = QString().sprintf(fmp->printfc, 0);
+ buff = QString().sprintf(fmp.printfc.constData(), 0);
}
}
break;
case XT_TRACK_NAME:
if (csv_track) {
QString r = csv_track->rte_name;
- buff = QString().sprintf(fmp->printfc, NONULL(r));
+ buff = QString().sprintf(fmp.printfc.constData(), NONULL(r));
}
break;
case XT_ROUTE_NAME:
if (csv_route) {
QString r = csv_route->rte_name;
- buff = QString().sprintf(fmp->printfc, NONULL(r));
+ buff = QString().sprintf(fmp.printfc.constData(), NONULL(r));
}
break;
/* GPS STUFF *******************************************************/
case XT_GPS_HDOP:
- buff = QString().sprintf(fmp->printfc, wpt->hdop);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->hdop);
field_is_unknown = !wpt->hdop;
break;
case XT_GPS_VDOP:
- buff = QString().sprintf(fmp->printfc, wpt->vdop);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->vdop);
field_is_unknown = !wpt->vdop;
break;
case XT_GPS_PDOP:
- buff = QString().sprintf(fmp->printfc, wpt->pdop);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->pdop);
field_is_unknown = !wpt->pdop;
break;
case XT_GPS_SAT:
- buff = QString().sprintf(fmp->printfc, wpt->sat);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->sat);
field_is_unknown = !wpt->sat;
break;
case XT_GPS_FIX: {
fix = "pps";
break;
}
- buff = QString().sprintf(fmp->printfc, fix);
+ buff = QString().sprintf(fmp.printfc.constData(), fix);
}
break;
/* GMSD ************************************************************/
case XT_COUNTRY: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(country, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(country, ""));
}
break;
case XT_STATE: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(state, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(state, ""));
}
break;
case XT_CITY: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(city, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(city, ""));
}
break;
case XT_POSTAL_CODE: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(postal_code, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(postal_code, ""));
}
break;
case XT_STREET_ADDR: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(addr, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(addr, ""));
}
break;
case XT_PHONE_NR: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(phone_nr, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(phone_nr, ""));
}
break;
case XT_FACILITY: {
garmin_fs_t* gmsd = GMSD_FIND(wpt);
- buff = QString().sprintf(fmp->printfc, GMSD_GET(facility, ""));
+ buff = QString().sprintf(fmp.printfc.constData(), GMSD_GET(facility, ""));
}
break;
/* specials */
case XT_FILENAME:
- buff = QString().sprintf(fmp->printfc, wpt->session->filename);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->session->filename);
break;
case XT_FORMAT:
- buff = QString().sprintf(fmp->printfc, wpt->session->name);
+ buff = QString().sprintf(fmp.printfc.constData(), wpt->session->name);
break;
case -1:
- if (strncmp(fmp->key, "LON_10E", 7) == 0) {
- buff = QString().sprintf(fmp->printfc, lon * pow(10.0, atof(fmp->key+7)));
- } else if (strncmp(fmp->key, "LAT_10E", 7) == 0) {
- buff = QString().sprintf(fmp->printfc, lat * pow(10.0, atof(fmp->key+7)));
+ if (strncmp(fmp.key.constData(), "LON_10E", 7) == 0) {
+ buff = QString().sprintf(fmp.printfc.constData(), lon * pow(10.0, atof(fmp.key.constData()+7)));
+ } else if (strncmp(fmp.key.constData(), "LAT_10E", 7) == 0) {
+ buff = QString().sprintf(fmp.printfc.constData(), lat * pow(10.0, atof(fmp.key.constData()+7)));
}
break;
default:
- warning(MYNAME ": Unknown style directive: %s\n", fmp->key);
+ warning(MYNAME ": Unknown style directive: %s\n", fmp.key.constData());
break;
}
QString obuff = csv_stringclean(buff, xcsv_file.badchars);
- if (field_is_unknown && fmp->options & OPTIONS_OPTIONAL) {
+ if (field_is_unknown && fmp.options & OPTIONS_OPTIONAL) {
continue;
}
/* As a special case (pronounced "horrible hack") we allow
* ""%s"" to smuggle bad characters through.
*/
- if (0 == strcmp(fmp->printfc, "\"%s\"")) {
+ if (0 == strcmp(fmp.printfc.constData(), "\"%s\"")) {
obuff = '"' + obuff + '"';
}
*xcsv_file.stream << obuff;
// Don't do potentially expensive replacements if token prefix
// isn't present;
if (original.contains("__")) {
- struct tm tm;
time_t my_time = gpsbabel_time;
- if (my_time == 0) { /* testo script ? */
- tm = *gmtime(&my_time);
- } else {
- tm = *localtime(&my_time);
- }
replacement.replace("__FILE__", xcsv_file.fname);
replacement.replace("__VERSION__", my_time == 0 ? "" : gpsbabel_version);
void
xcsv_data_write(void)
{
- time_t time;
- struct tm tm;
-
/* reset the index counter */
waypt_out_count = 0;
- time = gpsbabel_time;
- if (time == 0) { /* testo script ? */
- tm = *gmtime(&time);
- } else {
- tm = *localtime(&time);
- }
-
/* output prologue lines, if any. */
- for (auto line : xcsv_file.prologue) {
+ for (const auto& line : xcsv_file.prologue) {
QString line_to_write = xcsv_replace_tokens(line);
*xcsv_file.stream << line_to_write << xcsv_file.record_delimiter;
}
}
/* output epilogue lines, if any. */
- for (auto line : xcsv_file.epilogue) {
+ for (const auto& line : xcsv_file.epilogue) {
QString line_to_write = xcsv_replace_tokens(line);
*xcsv_file.stream << line_to_write << xcsv_file.record_delimiter;
}